<?php
/**
 * @author shenjun
 * @date 2009-09-06
 * @todo 整个网站的核心部份，框架主体。
 * 		2009-09-06增加了GZIP部份的支持
 *
 */
class frame{
	static private $module;
	static private $action;
	static private $theme='zh';
	static private $theme_msg;
	static private $datas;            //GET过来的变量
	
	private function __construct(){
		#设置时区
		ini_set('date.timezone',get_config('timezone'));
		if(get_config('GZIP')===true){
			$this->gzip();
		}
		$this->begin();
	}
	#开始启动框架
	private function begin(){
		$type=$this->get_type();
		if (file_exists(DOCUMENT_CONTROL.DS.self::$module.'.php')) {
			include_once(DOCUMENT_CONTROL.DS.self::$module.'.php');
			$class_name='control_'.self::$module;
			$class = & new $class_name ();
			if (method_exists($class,self::$action)) {
				$action=&self::$action;
				$param='"'.implode('","',self::$datas).'"';
				$param='$class->$action('.$param.');';
				eval($param);
				
			}elseif ($type=='ajax'){
				exit('{"success":"0","msg":"'.self::$theme_msg['no_class'].'"}');
			}
			$data=$class->get_data();
			if ($data) {
				#开始解释需要加载的变量
				foreach ($data as $key=>$value){
					$$key=$value;
				}
			}
			$setfile=$class->get_file();
		}
		if(empty($setfile)){
		    $file=DOCUMENT_VIEW.DS.self::$module.DS.self::$action.'.php';
		}else{
		    $file=DOCUMENT_VIEW.DS.$setfile.'.php';
		}
		if(file_exists($file)==false && $type=='html'){
			return_error(self::$theme_msg['no_tpl'],'-1');
		}
		#无缓存直接输入
		if ($type=='html' || $type=='post') {
			if (!file_exists($file)) {
				return_error('找不到模板！！！','-1',5);
			}
			if(get_config('GZIP')===true && strstr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip')){
				##如果打开GZIP则开启压缩功能并且浏览器支持
				header("Content-Encoding: gzip"); 
	        	header("Vary: Accept-Encoding");
				ob_start('ob_gzhandler'); 
				include($file);
				copyright();
				ob_end_flush();
			}else{ 
				include($file);
				copyright();
			}
			
			
		}elseif ($type!='ajax'){
			echo 'error';
		}
		#缓存处理部份暂时不做处理，后继做修改
		/*
		if($this->isset_cache($file)){#不需要生成cache
			$this->view_cache();
		}else{#需要生成cache文件
			$this->create_cache();
		}
		*/
	}
	#判断是否有cache,返回真则cache可用,假是不可用,需重新生成
	private function isset_cache($file){
		$cache_file=DOCUMENT_ROOT.'/'.get_config('cache_path').'/html/'.self::$module.'/'.self::$action.'.php';
		if(!file_exists($cache_file) || filemtime($file)>filemtime($cache_file)){  #如果cache不存在或者文件被修改过
			return false;
		}
		$cache_left=&get_config('cache_left');
		if(strtotime('-'.$cache_left.'s')>strtotime(filemtime($cache_file))){		#如果cache文件超过了存在的周期
			return false;
		}
		return true;
	}
	#创建cache文件
	private function create_cache(){
		ob_start();
		$file=DOCUMENT_ROOT.'/view/'.get_config('theme').'/'.self::$module.'-'.self::$action.'.php';
		$cache_file=DOCUMENT_ROOT.'/'.get_config('cache_path').'/'.self::$module.'-'.self::$action.'.php';
		if (file_exists($file))  include($file);
		$cache=ob_get_contents();
		$file=fopen($cache_file,'w');//创建文件
		fwrite($file,$cache);
		fclose($file);
	}
	#调用cache文件
	private function view_cache(){
		$cache_file=DOCUMENT_ROOT.'/'.get_config('cache_path').'/'.self::$module.'-'.self::$action.'.php';
		echo file_get_contents($cache_file);
	}
	//框架启动的入口
	static function exec($module=null,$action=null,$data=array()){
		$config=&get_config();
		frame::get_language();
		if($config->close==true){
			exit($config->close_msg);
		}
		if ($config->error_view==0) {
			error_reporting(0);
		}else{
			error_reporting(E_ERROR | E_WARNING | E_PARSE | E_ALL);
		}
		#判断是否打开调试开关
		if ($config->error_debug==1) {
			require_once(DOCUMENT_LIBRARIES.DS.'functions'.DS.'error_handler.php');
			set_error_handler('error_contral');
		}
		if ($config->error_send==1) {
			require_once(DOCUMENT_LIBRARIES.DS.'functions'.DS.'error_handler.php');
			set_error_handler('autosend_error');
		}
		#判断来源
		/*if ($config->in_index && $_SERVER['HTTP_REFERER']!=$config->vhost){
			return_error(self::$theme_msg['illegal_url'],'-1');
		}*/
		self::$module=$module;
		self::$action=$action;
		self::$datas=is_array($data) ? $data : array();
		new frame();
	}
	//取得当前的theme信息
	/*static function get_theme(){
		if(empty($_COOKIE['theme'])){
			#self::$theme=&get_config('theme');
			setcookie('theme',get_config('theme'),time()+30000);
			header('Location:'.$_SERVER['REQUEST_URI']);
		}
	}*/
	//取得语言包信息
	static function get_language(){
		#加载语言包
		self::$theme_msg=&get_language();
	}
	//启用php的gzip压缩功能
	function gzip() {
		ini_set('zlib.output_compression', 1);
		ini_set('zlib.output_compression_level', 2);
	}
	//判断当然请求的状态
	function get_type(){
		if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') {
			return 'ajax';
		}elseif ($_POST){
			return 'post';
		}else{
			return 'html';
		}
	}
}
?>